package dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.DriverPropertyInfo;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.Properties;
import java.util.logging.Logger;

import org.junit.jupiter.api.Test;

import com.mysql.cj.jdbc.CallableStatement;
import com.mysql.cj.jdbc.Driver;
import com.mysql.cj.protocol.Resultset;
import com.mysql.cj.x.protobuf.MysqlxCrud.Delete;
import com.mysql.cj.xdevapi.Result;
import com.mysql.cj.xdevapi.Statement;

public class Jdbc {
	/*
	 * JDBC 
	 * 1. DML
	 * 2. DQL	
	 * */
	public static void main(String[] args) {}
	// JDBC第一个步骤：DML语句操作,搞数据用的
	@Test
	public void testDML() throws ClassNotFoundException, SQLException {		//JDBC 执行过程
		//1. 导入jar包	，使用第三方jar包，mysqlServer版本和connector版本应该对应
			//由于此项目是传统project，使用new java project创建的工程，在目录中使用右键建立lib，导入jar包，右键jar包，build path,添加到
			//不想要了，右键，build path，remove
			//修复：右键jar包文件夹，properties，移除
		//2. 加载驱动，版本号5和8不一样，使用时需要注意。
		/*
		 * 5.~	com.mysql.jdbc.Driver
		 * 8.~	com.mysql.cj.jdbc.Driver
		 * */
		Class.forName("com.mysql.cj.jdbc.Driver");		//把类加载到JVM，如果报错，选择throws Exception
		//3. 获得链接,参数名 = 参数值   & 参数名1 = 参数值1,重点参数：中文字符集、服务器时区、公钥、
		String url = "jdbc:mysql://127.0.0.1:3306/st_211208?useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Hongkong&allowPublicKeyRetrieval=true";		//记牢,网络路径，参数
		Connection conn = DriverManager.getConnection(url, "root", "BaiXudemima26");						//获得数据库连接、账户、密码
		//4. 获得状态集
		java.sql.Statement st = conn.createStatement();
		//5. 执行SQL-DML
		String code = "1008";
		String name = "老八";
		int age = 30;
		/*        */String sql = "insert into person(code,name,age)values(1007,'王五',21)";						//常量写法
		//========//String sql_2 = "insert into person(code,name,age)values('"+code+"','"+name+"','"+age+"')";	//变量写法
		//影响的记录条数
		int result = st.executeUpdate(sql);
		System.out.println(result);
		//6. 关闭(先定义的连接后关闭，后定义的状态先关闭)
		st.close();
		conn.close();
		
	}
	// JDBC第二个步骤：DQL语句操作，查看数据用的
	@Test
	public void testDQL() throws SQLException {
		//1.创建驱动
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//2.获得链接
		String url = "jdbc:mysql://127.0.0.1:3306/st_211208?useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Hongkong&allowPublicKeyRetrieval=true";		//记牢,网络路径，参数
		Connection conn = DriverManager.getConnection(url, "root", "BaiXudemima26");
		//3.得到状态集
		java.sql.Statement st = conn.createStatement();
		//4.执行DQL
		String sql = "select code,name n,age from person";	//给name起别名，则使用时必须使用别名,否则报错Column "name" not found
		ResultSet result=st.executeQuery(sql);
		try {
			while(result.next()) {							//当result下一条非空，循环使用get得到每一行中每一项，sout打印。
				String code = result.getString("code");		//列名code
				String name = result.getString("n");		//列名name
				int age = result.getInt("age");				//列名age
				
				//另一种使用方法
				String code1 = result.getString(1);			//第1列
				String name1 = result.getString(2);			//第2列
				int age1 = result.getInt(3);				//第3列
				
				System.out.printf("%s %s %d\n",code,name,age);
				System.out.printf("----%s %s %d\n",code1,name1,age1);
			}
		}
		catch (Exception e) {
			System.out.println(e);
		}finally {
			try {
				//0.关闭
				if(result != null)
					result.close();
				if(st != null)
					st.close();
				if(conn != null)
					conn.close();
			}catch (Exception e2) {
				System.out.println(e2);
			}
		}
		
}
	// 研究的另外一种状态集
	/**						预处理状态集 & 标准状态集
	 区别：(自整理)
	 	1.预处理的状态集可以通过？的占位符进行预处理，然后在后面代码中使用set进行填充数据
	 	调用set方法的时候，必须将所有的？全部赋值,否则会报错。
	 	2.而标准的状态集只能通过使用定义好的String sql语句进行填充数据。
	 	3.也可以使用	ResultSet result = executeQuery();		//DQL
	 				int rs = executeUpdate();				//DML
	 	4.关闭，与正常的一样。
	 区别：(官方)
	 	1.语法不同
	 	2.效率不同：PreparedStatement可以使用sql缓存
	 	3.安全性不同：PreparedStatement可以有效防止sql注入
	 	
	 * */
	public void test() {
		String code = "1 or 1=1";
		String sql1 = "delete from person where code = ?";
		String sq2 = "Delete fromDelete person where code = '" + code + "'";
	}
	public void test2 (Connection conn) throws SQLException{
		CallableStatement callst = (CallableStatement) conn.prepareCall("Call procedure_test()");
	}
	public void testP() throws Exception {			//预处理的状态集
		Class.forName("com.mysql.cj.jdbc.Driver");
		String url = "jdbc:mysql://127.0.0.1:3306/st_211208?useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Hongkong&allowPublicKeyRetrieval=true";		//记牢,网络路径，参数
		Connection connection = DriverManager.getConnection(url,"root","BaiXudemima26");
//		String sql = "insert into person(code,name,age)values(?,?,?)";		//根据书写的顺序从左往右数第几个
		String sql = "Update person set name=?,age=? where code=?";			//另一种使用方式
		PreparedStatement pst = connection.prepareStatement(sql);			//预处理的
		pst.setString(1, "A1010");	//第一个问号
		pst.setString(2, "老九");	//第二个问号
		pst.setInt(3, 19); 	//第三个问号
	}
	
	// 练习环节，默写代码
	public void testSelf() throws ClassNotFoundException {
		//1. 获得驱动
		Class.forName("com.mysql.cj.jdbc.Driver");
		//2. 获得链接
	
	}
}



